package service

import (
	"errors"
	"fmt"
	"github.com/kevin186/casbin/lib"
	"github.com/kevin186/casbin/models"
)

//func DeleteRole(roleName, routerName, routerMethod string, roleId int) (*models.Role, error) {
//	roles := &models.Role{
//		RoleName: roleName,
//	}
//	router := []models.Router{
//		{
//			RouterName:   routerName,
//			RouterMethod: routerMethod,
//		},
//	}
//	//lib.DB.Preload("Routers").Find(&role)
//	lib.DB.Where("role_name = ?", roleName).Find(&roles)
//	fmt.Println(roles)
//	if err := lib.DB.Model(&roles).Association("Routers").Delete(router); err != nil {
//		fmt.Println("[deleteRole]: 删除Role失败", err.Error())
//		return nil, err
//	}
//
//	// 删除role下所有routers
//	//role := &models.Role{}
//	//lib.DB.Preload("Tag1s").Take(&role, roleId)
//
//	//if err := lib.DB.Model(&role).Association("Routers").Delete(role.Routers); err != nil {
//	//	fmt.Println("[deleteRole]: 删除Role失败")
//	//	return nil, err
//	//}
//
//	//lib.DB.First(&role)
//	//if err := lib.DB.Model(&role).Association("Routers").Delete([]*models.Router{
//	//	{
//	//		RouterName:   routerName,
//	//		RouterMethod: routerMethod,
//	//	},
//	//}); err != nil {
//	//	fmt.Println("[deleteRole]: 删除Role失败")
//	//	return nil, err
//	//}
//
//	return roles, nil
//}

//func DeleteRole(roleName, routerName, routerMethod string, roleId int) ([]*models.Role, error) {
//	role := &models.Role{RoleName: roleName}
//	router := &models.Router{RouterName: routerName, RouterMethod: routerMethod}
//
//	if err := lib.DB.Where("role_name = ?", roleName).Find(role).Error; err != nil {
//		fmt.Println("[deleteRole]: 查询Role失败", err.Error())
//		return nil, err
//	}
//
//	if err := lib.DB.Model(role).Association("Routers").Delete(router); err != nil {
//		fmt.Println("[deleteRole]: 删除Role失败", err.Error())
//		return nil, err
//	}
//
//	return []*models.Role{role}, nil
//}
func DeleteRoleRouter(roleName, routerName, routerMethod string, roleId int) ([]*models.Role, error) {
	role := &models.Role{RoleName: roleName}

	if err := lib.DB.Where("role_name = ?", roleName).Preload("Routers").Find(role).Error; err != nil {
		fmt.Println("[deleteRole]: 查询Role失败", err.Error())
		return nil, err
	}

	var routerToDelete *models.Router
	for _, r := range role.Routers {
		if r.RouterName == routerName && r.RouterMethod == routerMethod {
			routerToDelete = r
			break
		}
	}

	if routerToDelete == nil {
		fmt.Println("[deleteRole]: 要删除的Router未找到")
		return nil, errors.New("要删除的Router未找到")
	}

	// TODO 此处需要使用事务来操作，否则当removePolicy失败时，却将roleRouter删除了
	if err := lib.DB.Model(role).Association("Routers").Delete(routerToDelete); err != nil {
		fmt.Println("[deleteRole]: 删除Role失败", err.Error())
		return nil, err
	}

	// 删除casbin_role中对应的policy
	res, err := lib.E.RemovePolicy(roleName, "/"+routerName, routerMethod)
	if err != nil {
		fmt.Println("删除角色失败：", role)
	}
	fmt.Println("删除角色成功：", res)
	return []*models.Role{role}, nil
}
